#pragma once
#include <iostream>
#include <string>
#include <time.h>
#include <pthread.h>

// 定义函数指针类型，用于存储线程回调函数
// 无参数、无返回值的函数指针
typedef void (*callback_t)(); //callback_t 和 void (*)()等价

// 用于生成线程名称的静态计数器
static int num = 1;

class Thread
{
public:
    // 静态线程入口函数（pthread_create的要求）
    // args: 传入的参数（Thread对象指针）
    // 返回值：线程退出时的返回值
    static void* Routine(void* args)
    {
        Thread* thread = static_cast<Thread*>(args);  // 将void*转换回Thread*
        thread->Entery();  // 调用实际的线程入口函数
        return nullptr;
    }

public:
    // 构造函数
    // cb: 线程要执行的回调函数
    Thread(callback_t cb) // callback_t cb等价于 void (*cb)()
        : tid_(0),              // 线程ID初始化为0
          name_(""),            // 线程名初始化为空
          start_timestamp_(0),  // 启动时间戳初始化为0
          isrunning_(false),    // 运行状态初始化为false
          cb_(cb)               // 设置回调函数
          // 表示将构造函数参数 cb 赋值给成员变量 cb_
    {}

    // 析构函数
    ~Thread()
    {}

    // 启动线程
    void Run()
    {
        name_ = "thread-" + std::to_string(num++);  // 生成线程名称
        start_timestamp_ = time(nullptr);           // 记录启动时间戳
        isrunning_ = true;                         // 设置运行状态为true
        // 创建线程，传入this指针作为参数
        pthread_create(&tid_, nullptr, Routine, this);
        /*
            int pthread_create(
                pthread_t *thread,          // 输出参数，存储新创建的线程ID
                const pthread_attr_t *attr, // 线程属性，nullptr表示使用默认属性
                void *(*start_routine)(void*), // 线程函数
                void *arg                   // 传递给线程函数的参数
            );
        */
    }

    // 等待线程结束
    void Join()
    {
        pthread_join(tid_, nullptr);  // 等待线程结束
        /*
        int pthread_join(pthread_t thread, void **retval);
        参数说明：
            thread: 要等待的线程的线程ID（pthread_t类型）
            retval: 用于存储线程的返回值的指针。如果不关心返回值，可以传入nullptr
        返回值：
            成功返回0
            失败返回错误码
        */
        isrunning_ = false;          // 设置运行状态为false
    }

    // 获取线程名称
    std::string Name()
    {
        return name_;
    }

    // 获取线程启动时间戳
    uint64_t StartTimestamp()
    {
        return start_timestamp_;
    }

    // 获取线程运行状态
    bool IsRunning()
    {
        return isrunning_;
    }

    // 实际的线程入口函数
    void Entery()
    {
        cb_();  // 执行回调函数
    }

private:
    pthread_t tid_;             // 线程ID
    std::string name_;          // 线程名称
    uint64_t start_timestamp_;  // 启动时间戳
    bool isrunning_;            // 运行状态标志

    callback_t cb_;             // 回调函数指针
    //等价于 void (*cb)()
};
